package com.bpvse;

import com.util.AES_EUnit;
import com.util.DataUnit;
import com.util.F1Unit;


//获得一个关键字的一个版本对应的多个文件搜索的结果
public class DecryptionTest {
    //Message表示解密后的明文消息将存储在这个字节数组中
    //outputlen这是一个长度为1的整数数组,用于存储解密后的明文消息的长度
    //密钥ckey
    //result表示加密的结果数据
    //resultLen表示result数组的长度,即加密结果数据的总长度
    //aRlen用于存储每个版本对应的结果长度
    //aVer:这个字节数组包含了版本信息
    //averLen表示版本信息的个数,即aVer数组中包含的版本数量。
    //keyword:这是一个关键字的字节数组表示,用于生成解密密钥
    // wordLen:表示关键字的长度,即keyword数组的长度

    public static void Decryption(byte[] Message, int[] outputlen, byte[] ckey, byte[] result, int resultLen, int[] aRlen, byte[] aVer, int averLen, byte[] keyword, int wordLen) {
        byte[] tmp = new byte[DataUnit.HASH_LEN];
        byte[] sk = new byte[DataUnit.HASH_LEN];
        byte[] strV = new byte[DataUnit.HASH_LEN];
        int index = 0;

        for (int i = 0; i < averLen; i++) {

            //通过版本号找到对应的信息
            System.arraycopy(aVer, (averLen - i - 1) * DataUnit.HASH_LEN, strV, 0, DataUnit.HASH_LEN);

            //通过版本信息计算状态值
            F1Unit.F1(sk, keyword, wordLen, strV, ckey, 2);
            for (int j = 0; j < aRlen[i]; j++) {
                System.arraycopy(result, index + j * DataUnit.HASH_LEN, tmp, 0, DataUnit.HASH_LEN);
                AES_EUnit.AES_D(Message, index + j * DataUnit.HASH_LEN, tmp, sk,DataUnit.HASH_LEN);
            }
            index += aRlen[i] * DataUnit.HASH_LEN;
        }
        outputlen[0] = index;
    }
}
